<?php

class MY_Api extends CI_Controller {

	/**
	 * 是否开启访问控制
	 * 如果本项设置为false ,则不检查所有来源ip是否在许可列表,也不检查权限
	 * @var Boolean
	 */
	protected $enable_access_control = FALSE;
	
	/**
	 * 数据
	 * @var array
	 */
	protected $data = array();
	
	/**
	 * 允许的请求来源ip地址列表
	 */
	protected $allow_request_ip_list = array(
			'127.0.0.1'
	);
	
	/**
	 * 不限制请求ip的接口名称列表
	 * 如果需要指定某个接口，所有ip可以访问,则把接口方法名添加到这个属性中
	 *
	 * @var array
	 * @example array('login')
	 */
	protected $public_interface = array();
	
	/**
	 * 错误码
	 * @param integer $error_code 值为0时表示处理成功
	 * @var integer
	 */
	protected $error_code = 0;
	
	/**
	 * 错误信息
	 * @var string
	 */
	protected $msg = '';
	
	/**
	 * 构造器检查请求
	 */
	public function __construct(){
		parent::__construct();
		$this->router->fetch_class();
		if ( $this->enable_access_control ){
			if ( !$this->_check_request_ip() && !in_array($this->router->fetch_method(), $this->public_interface)) {
				$this->set_error_code(1001);
				$this->set_msg('do not allow access this api from your ip adress!');
				$this->output();
			}
				
			if ( !$this->auth() ){
				$this->set_error_code(1002);
				$this->set_msg('auth failed!');
				$this->output();
			}
		}
	}
	
	/**
	 * 验证请求是否合法
	 */
	protected function auth(){
		return true;
	}
	
	/**
	 * 设置错误码
	 * @param integer $code
	 */
	protected function set_error_code($code){
		$this->error_code = $code;
	}
	
	/**
	 * 添加不需要验证即可访问的接口名称
	 * @param $api_name string 接口名称
	 */
	protected function add_public_interface($api_name){
		$this->public_interface[] = $api_name;
	}
	
	/**
	 * 设置错误信息
	 * @param string $msg
	 */
	protected function set_msg($msg){
		$this->msg = $msg;
	}
	
	/**
	 * 设置返回数据
	 * @param array $data
	 */
	protected function set_data($data){
		$this->data = $data;
	}
	
	/**
	 * 检查请求ip
	 */
	private function _check_request_ip(){
		$client_ip = $this->input->ip_address();
		if (!in_array($client_ip, $this->allow_request_ip_list)) {
			return false;
		}
		return true;
	}
	
	/**
	 * 输出结果
	 */
	protected function output(){
		$data = array(
				'error_code'=> $this->error_code,
				'error_msg' => $this->msg,
				'data' => $this->data
		);
		echo json_encode($data);
		exit;
	}
}